#include "txttojsonprocessor.h"
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QJsonDocument>
#include <QSet>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QStringConverter>
#endif

bool TxtToJsonProcessor::processTxtToJson(const QString& inputPath, const QString& outputPath) {
    try {
        QFile inputFile(inputPath);
        if (!inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "无法打开输入文件:" << inputPath;
            return false;
        }

        QTextStream in(&inputFile);
        #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
            in.setEncoding(QStringConverter::Utf8);
        #else
            in.setCodec("UTF-8");
        #endif

        QJsonArray jsonArray;
        QSet<QString> sourceTexts;
        QString source, translation;
        int lineCount = 0;

        while (!in.atEnd()) {
            QString line = in.readLine().trimmed();
            lineCount++;

            // 跳过空行
            if (line.isEmpty()) {
                continue;
            }

            // 第一行是源文本
            if (source.isEmpty()) {
                source = line;
                continue;
            }

            // 第二行是翻译文本
            if (!source.isEmpty() && translation.isEmpty()) {
                translation = line;
                
                // 处理一对翻译
                if (!source.isEmpty() && !translation.isEmpty()) {
                    processTranslationPair(source, translation, sourceTexts, jsonArray);
                }

                // 清空缓存，准备处理下一对
                source.clear();
                translation.clear();
                continue;
            }
        }

        inputFile.close();

        // 写入JSON文件
        QFile outputFile(outputPath);
        if (!outputFile.open(QIODevice::WriteOnly)) {
            qDebug() << "无法创建输出文件:" << outputPath;
            return false;
        }

        QJsonDocument doc(jsonArray);
        outputFile.write(doc.toJson(QJsonDocument::Indented));
        outputFile.close();

        qDebug() << "成功处理" << jsonArray.size() << "条记录";
        qDebug() << "JSON文件已保存到:" << outputPath;
        return true;

    } catch (const std::exception& e) {
        qDebug() << "处理文件时发生错误:" << e.what();
        return false;
    }
}

bool TxtToJsonProcessor::isValidTranslation(const QString& source, const QString& translation) {
    // 检查源文本和翻译是否为空
    if (source.isEmpty() || translation.isEmpty()) {
        qDebug() << "源文本或翻译为空，跳过处理";
        return false;
    }

    // 检查源文本长度是否过短
    if (source.length() < 5) {
        qDebug() << "源文本长度过短，跳过:" << source;
        return false;
    }

    // 计算字数差距百分比
    float sourceLen = source.length();
    float translationLen = translation.length();
    float ratio = (sourceLen > translationLen) ? 
                 (translationLen / sourceLen) : 
                 (sourceLen / translationLen);

    if (ratio < 0.35) {
        qDebug() << "翻译前后字数差距过大，跳过:" << source;
        return false;
    }

    return true;
}

void TxtToJsonProcessor::processTranslationPair(const QString& source, 
                                              const QString& translation,
                                              QSet<QString>& sourceTexts,
                                              QJsonArray& jsonArray) {
    // 检查源文本是否重复
    if (sourceTexts.contains(source)) {
        qDebug() << "发现重复的待翻译内容，跳过:" << source;
        return;
    }

    // 检查翻译是否有效
    if (!isValidTranslation(source, translation)) {
        return;
    }

    // qDebug() << "处理翻译对:";
    // qDebug() << "源文本:" << source;
    // qDebug() << "翻译:" << translation;

    // 添加到已处理集合
    sourceTexts.insert(source);

    // 创建并添加JSON对象
    jsonArray.append(createJsonObject(source, translation));
}

QJsonObject TxtToJsonProcessor::createJsonObject(const QString& source, const QString& translation) {
    QJsonObject obj;
    obj["instruction"] = "你是一名中文翻译专家，将以下文字翻译为简体中文：";
    obj["input"] = source;
    obj["output"] = translation;
    return obj;
} 